<template>
	<view class="searchLayout">
		<view class="search">
			<uni-search-bar 
			@confirm="onSearch"
			@cancel="onClear"
			@clear="onClear"
			focus 
			placeholder="搜索"
			v-model="queryParams.keyword">
			</uni-search-bar>
		</view>		
		<view v-if="!classList.length || noSearch">
			<view class="history" v-if="historySearch.length">
				<view class="topTitle" >
					<view class="text">最近搜索</view>
					<view class="icon" @click="removeHistory">
						<uni-icons type="trash" size="25"></uni-icons>
					</view>
				</view>
				<view class="tabs">
					<view class="tab" v-for="tab in historySearch" :key="tab" @click="clickTab(tab)">{{tab}}</view>		
				</view>
			</view>			
			<view class="recommend">
				<view class="topTitle">
					<view class="text">热门搜索</view>				
				</view>
				<view class="tabs">				
					<view class="tab" v-for="tab in recommendList" :key="tab" @click="clickTab(tab)">{{tab}}</view>
				</view>
			</view>
		</view>		
		<view class="noSearch" v-if="noSearch">
			<uv-empty mode="search" icon="/static/images/noresult.png"></uv-empty>
		</view>	
		<view v-else>
			<view class="list">
				<navigator :url="`/pages/preview/preview?id=${item._id}`" class="item" 
				v-for="item in classList" :key="item._id">				
					<image :src="item.smallPicurl" mode="aspectFill"></image>				
				</navigator>
			</view>		
			<view class="loadingLayout" v-if="noData || classList.length"><uni-load-more :status="noData?'noMore':'loading'"/></view>
		</view>		
	</view>
</template>

<script setup>
import {apiSearchWall} from '@/api/apis.js'

//查询参数
const queryParams = ref({	
	pageNum:1,
	pageSize:12,
	keyword:""
})
//历史搜索列表
const historySearch = ref(uni.getStorageSync('historySearch')||[]);
//热门搜索列表
const recommendList = ref(["美女","帅哥","宠物","卡通"]);
//搜索列表
const classList = ref([]);
//没有更多
const noData = ref(false);
//没有搜索结果
const noSearch = ref(false);

//初始化函数
const initParams=(value='')=>{
	// 搜索列表清空
	classList.value=[]
	//noData初始化
	noData.value=false
	//noSearch初始化
	noSearch.value=false
	//请求参数清空
	queryParams.value={
		pageNum:1,
		pageSize:12,
		keyword:value
	}
}
//搜索函数
const searchWall=async ()=>{
	//信息提示
	uni.showLoading({
		title:"加载中..."
	})
	//发送请求获取数据
	let res=await apiSearchWall(queryParams.value)
	//把数据追加到classList里
	classList.value=[...classList.value,...res.data]
	//把搜索列表放入本地存储（预览页面需要读取本地存储）
	uni.setStorageSync('storageClassList',classList.value)
	//如果没有数据，改变noData的值
	if(queryParams.value.pageSize>res.data.length) noData.value=true
	//如果本次请求没有搜索结果并且搜索列表中没有元素，改变noSearch的值
	/*加上第二个判断条件的原因：
	  下拉刷新一直在发送请求获取数据，不能因为最后一次请求不到数据了把前面已经请求到的数据给隐藏掉*/
	if(res.data.length==0&&classList.value.length==0) noSearch.value=true
}
//回车搜索
const onSearch =async ()=>{
	try{
		//历史搜索列表加入新元素（限制10条）
		historySearch.value=[...new Set([queryParams.value.keyword,...historySearch.value,])].slice(0,10)
		//更新缓存：将历史搜索列表放入缓存
		uni.setStorageSync('historySearch',historySearch.value)
		//初始化（这个初始化函数，需要把用户搜索的关键字放到请求参数queryParams内部）
		initParams(queryParams.value.keyword)
		//发送请求获取数据
		searchWall()
	}finally{
		uni.hideLoading()
	}
}
//触底搜索
onReachBottom(()=>{
	//如果已经没有数据，直接返回
	if(noData.value) return
	//页码+1
	queryParams.value.pageNum++
	//发送请求获取数据
	searchWall()
})
//标签搜索
const clickTab = (value)=>{
	//初始化（这个初始化函数，需要把用户搜索的关键字放到请求参数queryParams内部）
	initParams(value)
	//回车搜索（因为要把热门标签也放到历史标签列表中）
	onSearch()
}
//点击清除按钮
const onClear = ()=>{
	//初始化
	initParams()
}
//点击清空搜索记录
const removeHistory = ()=>{
	uni.showModal({
		title:"是否清空历史搜索？",
		success:res=>{
			if(res.confirm){
				console.log("确认删除");	
				//清空历史搜索列表的缓存
				uni.removeStorageSync('historySearch')
				//清空历史列表数组
				historySearch.value=[]
			}
		}
	})
}
//关闭有页面
onUnload(()=>{
	//清空本地存储中搜索列表的缓存（提高性能）
	uni.removeStorageSync('storageClassList')
})
</script>

<style lang="scss" scoped>
.searchLayout{
	.search{
		padding:0 10rpx;
	}
	.topTitle{
		display: flex;
		justify-content: space-between;
		align-items: center;
		font-size: 32rpx;
		color:#999;
	}
	.history{
		padding:30rpx;		
	}
	.recommend{
		padding:30rpx;
	}
	.tabs{
		display: flex;		
		align-items: center;
		flex-wrap: wrap;
		padding-top:20rpx;
		.tab{
			background: #F4F4F4;
			font-size: 28rpx;
			color:#333;
			padding:10rpx 28rpx;
			border-radius: 50rpx;
			margin-right: 20rpx;
			margin-top: 20rpx;
		}
	}	
	.list{
		display: grid;
		grid-template-columns: repeat(3,1fr);
		gap: 5rpx;
		padding:20rpx 5rpx;		
		.item{
			height: 440rpx;
			image{
				width: 100%;
				height: 100%;
				display: block;
			}			
		}		
	}
}
</style>
